# 레이블과 애너테이션
Assembled by GimunLee
# 레이블
- 레이블은 키-값 쌍으로 구성하며, 사용자가 클러스터 안에 오브젝트를 만들 때 메타데이터로 설정할 수 있음
- 레이블의 키는 쿠버네티스 안에서 컨트롤러들이 파드를 관리할 때 자신이 관리해야할 파드를 구분하는 역할
- 쿠버네티스는 레이블 만으로 관리 대상을 구분하므로 특정 컨트롤러가 만든 파드라도 레이블을 변경하면 인식할 수 없음
- 레이블 덕분에 컨트롤러와 파드는 느슨한 결합도를 가짐
- 접두어가 있는 레이블의 키는 쿠버네티스 시스템에서 사용하는 레이블(
kubernetes.io
) - 레이블을 선택하는 조건을 다양하게 혼합해서 사용할 수 있는 것이 쿠버네티스의 강력한 장점
# 활용
- 레이블을 이용해 운영하고 있는 서비스에 영향 없이 현재 이슈가 발생한 파드만을 따로 분리해서 확인 가능
- 노드에도 레이블을 설정할 수 있으므로 클러스터 안 노드들을 레이블로 구분한 다음 특정 레이블이 있는 노드에만 자원 할당 가능
# 레이블 셀렉터(Label Selector)
- 사용자가 특정 레이블을 설정한 자원만 선택해서 관리 가능
- 레이블 셀렉터는 등호 기반(equality-based), 집합 기반(set-based) 두 가지 방식으로 설정
# 예시1)
environment=develop
release=stable
- 레이블의 키가 enviroment인 것 중 값이 develop인 것들을 선택
- 레이블의 키가 release인 것 중 값이 stable인 것들을 선택
- 두가지 모두 만족시키는 것을 찾으려면 쉼표(,)로 연결
# 예시2)
environment in (develop, stage)
release notin (latest, canary)
gpu
!gpu
- enviroment가 develop이거나 stage인 레이블을 선택
- release가 lastest와 canary가 아닌 레이블을 선택
- release라는 키가 없는 모든 오브젝트를 선택
- gpu라는 레이블 키가 있는 모든 레이블을 선택
- gpu라는 키가 없는 모든 레이블 선택
# 사용
$ kubectl get pods -l app=nginx
$ kubectl get pods -l evironment=develop, release=stable
$ kubectl get pods -l "app=nginx,environment not in (develop)"
# 애너테이션
애너테이션은 레이블과 마찬가지로 키-값 쌍으로 구성하며 레이블처럼 사용자가 설정 가능
레이블이 사용자가 설정한 특정 레이블의 오브젝트들을 선택한다면, 애너테이션은 쿠버네티스 시스템이 필요한 정보들을 담았으며, 쿠버네티스 클라이언트나 라이브러리가 자원을 관리하는데 활용
애너테이션의 키는 쿠버네티스 시스템이 인식할 수 있는 값을 사용
예를 들어 디플로이먼트로 앱을 배포할 때 변경 사유를 적는 CHANGE-CAUSE(kebernetes.io/change-cause) 정보를 작성하는 것
사용자에게 필요한 정보들을 메모하는 용도로 사용 가능
릴리즈 정보, 로깅, 모니터링에 필요한 정보들, 비상 연락처를 적어둘 수 있음
# 배포 방법
# 롤링업데이트
- 배포된 전체 파드를 한꺼번에 교체하는 것이 아니라 일정 개수씩 교체하면서 배포(디플로이먼트의 기본 배포 방법)
# 블루/그린
- 기존에 실행된 파드 개수와 같은 개수의 신규 파드를 모두 실행한 후 신규 파드가 정상적으로 실행됐는지 확인
- 트래픽을 한꺼번에 신규 파드쪽으로 옮김
# 카나리
- 신규 파드를 배포할 때 한꺼번에 앱 컨테이너 전체를 교체하지 않고, 기존 버전을 유지한 채로 일부 버전만 신규 파드로 교체
- 버그나 이상은 없는지, 사용자 반응은 어떤지 확인할 때 유용
# Referenses
- 쿠버네티스 입문 - 90가지 예제로 배우는 컨테이너 관리 자동화 표준 / 동양북스